import axios from "axios";

const request = axios.create({
  baseURL: "",
  timeout: 5000,
  headers: {},
});

//请求拦截器往前插入 响应拦截器往后插入 所以请求的时候按顺序先插入拦截器2 , 再往2前面插入拦截器1 ,最后再插入响应拦截器 ,执行出来就是先执行1 再执行2 请求拦截器的error处理上一个的错误
//请求拦截器2
//如果设置多个请求拦截器,则倒序执行
request.interceptors.request.use(
  (config) => {
    // console.log("请求拦截器2");
    return config;
  },
  //问题1: 请求拦截器的处理失败的函数什么时候进入???
  //答案:我们可以配置多个请求拦截器,请求拦截器的失败处理函数主要处理的是上一个请求失败的错误
  (error) => {
    // console.log(error, "我是拦截器2");

    return Promise.reject(error);
  }
);
//请求拦截器1
request.interceptors.request.use(
  (config) => {
    // console.log("请求拦截器1");
    return config;
    // return Promise.reject("拦截器1错误");
  },
  //问题1: 请求拦截器的处理失败的函数什么时候进入???
  //答案:我们可以配置多个请求拦截器,请求拦截器的失败处理函数主要处理的是上一个请求失败的错误
  (error) => {
    return Promise.reject(error);
  }
);

//响应拦截器
request.interceptors.response.use(
  (response) => {
    // return Promise.resolve(response);
    // console.log(response.data.data);
    return response.data.data;
  },
  (error) => {
    //为什么拦截器失败要返回失败的promise,而成功只需要返回值??
    //axios的拦截器原理其实就是promise的then方法,拦截器的内部两个回调函数,就是then方法的处理成功和失败的回调函数
    //then默认返回成功的promise,then返回失败的promise只有两种情况 一是then中报错了,二是then中返回失败的promise
    //而进入失败拦截器回调函数,代表请求失败了,就需要返回一个失败的promise,所以只能在失败中返回一个失败的promise,拦截器才会返回失败的promise
    return Promise.reject(error);
  }
);

export default request;
